<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 
      v8引擎:
        它本身是一个应用程序，它其实就是js的执行环境。当然这里，只是考虑了浏览器平台，那比如说node js平台
          下，它同样用的也是v8，这一块，并不做研究。去把它看作是浏览器的一个组成部分，用来解析和编译，我们所书写的js代码。
          在它内部，同样也存在着很多的子模块，这里的话，就通过一张图示来对它去进行说明。那首先我们从最左侧，我们来去看我们放置的，
          就是浏览器的渲染引擎，所以v8引擎它其实只是浏览器渲染引擎里的一个js执行代码的组成部分。
      
      scanner
        它其实就是一个扫描器，那对于我们的纯文本的JavaScript代码，去进行词法的分析。生成tokens信息给parser和pre parser

      parser 与 pre parser
        域解析和全量解析，域解析就是我们图中所看到的pre persal，原则上来说，我们所编写的代码其实都应该是被直接解析的。
        但是，在我们的代码里边也会存在着很多声明，在后续里边并没有对它去进行使用。例如，我们这一块定义
        了一个函数，但是，我们并没有在后边对它去进行调用，此时的话，如果我们要去做全量解析，那么就会有很多的无用功。因为后续，
        我们都需要去把它转为字节码，再去变成机器码，才能去执行，可是，我们又不真正的去执行它们，所以这些操作，就变得没有意
        义，因此，也就有了预解析的方案。对于预解析的实现来说，我们是没有必要去深究的。只需要了解他的一些特点。
        
        pre parser它的优点：
          1. 跳过那些不被使用的代码，同样也不会去生成AST。但是会去产生一些相应的scope信息。当然了，这些信息会有一些自己的
          特点，比如说并没有变量的引用和声明，因为在这一块，并不是真正的执行。
          2. 去抛出一些特定的错误，因为并不是全量的解析，所以，有一些错误它并不会完全的抛出。
          3. 解析速度，会更快一些。

        parser优点：
          parser又叫做全量解析。全量解析是会立即解析所有立即执行的代码，再去生成AST语法树。同时也会去确定更多的信息，
          这个步骤，其实就是对应着执行上下文的创建。
          
          这里，需要知道一下作用域的scope以及作用域链scope china这样的一些信息，
          刚才说了，就是在这个预解析和解析阶段就创建好了的，而此时，代码是并列执行的这一点，需要去明确。
          
          如果说在父函数当中再次去声明一个函数，那也就意味着在内部的函数，同样也会被去解析两次。所以，嵌到层级
          太深的时候，就会去导致多次的解析操作，因此，再去书写代码的时候也要去减少，不必要的函数嵌套。注意这一块说的是函数
          嵌套，因为这样去做的话，可以去执行代码的执行效率，而这个并不是代码执行阶段，只是引擎在代码执行之前去进行编译，
          或者说，预解析的时候所完成的一些操作。
          
      ignition：
        v8当中所提供的一个解释器，注意这是一个解释器它的作用，就是去把之前所生成的抽象语法树AST，然后去把它转为字节码（btye code）。
        那同时他还会去收集在下一个编译阶段所需要的一些信息，
        
      TurboFan:
        v8引擎当中的编译器模块之前得到的是字节码，那最终要去执行的肯定是机器码，所以，它会去利用我们上一个环节当中，所收集到
        的信息。然后把这些字节码来转化为具体的汇编代码之后，就可以去开始的代码执行了。也就是后续，需要去分析和理解的堆栈执
        行过程.

      总结: 
        在浏览器当中，是存在着渲染引擎的，而v8，只是它里边专门用于处理js代码的一个部分。那代码在执行之前，是会经历很多的步骤的，
        我们把这些个步骤，就统称的称为编译的过程。而作用域和作用域链的确认，其实就是在编译阶段就已经发生好的，那之后的话，
        还需要去知道一下v8的一些基本的操作，首先第一，我们要知道词法分析，然后，就是语法分析之后的话，会有预解析，或者说全量解析。
        那再有，就是一个预编辑，预编译，或者统称为编译。最后，就是拿到这个具体的机器码之后，就可以去执行代码了。
        剩下的事情，就是到了这个堆栈的一个层面上.
    -->
  </body>
</html>
